package china.accountinghelper.controls;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import china.wc.tallyhelper.R;
import china.wc.tallyhelper.adapter.AdapterSlideMenu;

/**
 * 自定义的组件，使用bottom.xml中的ListView来显示当前Activity的菜单。
 * 
 * 在Activity中，生成SlideMenu的步骤：
 * 1 生成SlideMenu对象。
 * 2 调用SlideMenu.addSlideMenuItem(int pArrayId)方法，将菜单项添加到Activity底部的ListView上。
 * 3 实现ListView的点击事件。
 * 
 * @author 王超
 * 
 */
public class SlideMenu
{
  // 当前Activity
  private Activity                     mActivity;
  // 用来存放菜单项的List
  private List<SlideMenuItem>          mListMenuItems;
  // 菜单打开标志位
  private boolean                      mIsClosed;
  // 菜单点击监听器对象
  private OnSlideMenuItemClickListener mOnSlideMenuItemClickListener;
  // 实际显示菜单的ListView
  private ListView                     mListViewSlideMenu;
  // 点击这个LinearLayout，来打开和关闭SlideMenu
  private LinearLayout                 mLinearLayoutWelcome;
  //控制这个LinearLayout的android:layout_height，来实现打开或关闭SlideMenu。
  private LinearLayout mFrame_Include_Bottom;
  // 控制这个LinearLayout的visibility，来实现打开或关闭SlideMenu。同时其也接受键盘事件。
  private LinearLayout                 mLinearLayoutSlideMenu;
  // 打开或关闭SlideMenu时，改变这个ImageView的图片
  private ImageView                    mImageViewArrow;

  public SlideMenu(Activity pActivity)
  {
    mActivity = pActivity;
    this.initVariables();
    this.initViews();
    this.initListeners();
  }

  /**
   * 初始化变量，包括List、菜单标志位。
   */
  private void initVariables()
  {
    mIsClosed = true;
    mListMenuItems = new ArrayList<SlideMenuItem>();
  }

  /**
   * 初始化View。
   */
  private void initViews()
  {
    mListViewSlideMenu = (ListView) mActivity.findViewById(R.id.Bottom_ListView_SlideMenu);
    mFrame_Include_Bottom = (LinearLayout) mActivity.findViewById(R.id.Frame_Include_Bottom);
    mLinearLayoutWelcome = (LinearLayout) mActivity.findViewById(R.id.Bottom_LinearLayout_Welcome);
    mLinearLayoutSlideMenu = (LinearLayout) mActivity.findViewById(R.id.Bottom_LinearLayout_SlideMenu);
    mImageViewArrow = (ImageView) mActivity.findViewById(R.id.Bottom_ImageView_Arrow);
  }

  /**
   * 初始化Listener。
   */
  private void initListeners()
  {

    // 设置mLinearLayoutWelcome的点击事件，打开/关闭SlideMenu
    mLinearLayoutWelcome.setOnClickListener(new OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        SlideMenu.this.toggle();
      }
    });

    // 设置mLinearLayoutWelcome的Menu按键的KEY事件，打开/关闭SlideMenu。
    mLinearLayoutWelcome.setOnKeyListener(new OnKeyListener()
    {
      @Override
      public boolean onKey(View v, int keyCode, KeyEvent event)
      {
        // KeyCode是Menu键，并松开时
        if (keyCode == KeyEvent.KEYCODE_MENU && event.getAction() == KeyEvent.ACTION_UP)
        {
          // 开关SlideMenu，拦截KeyEvent。
          SlideMenu.this.toggle();
          return true;

          // KeyCode是Back键，并松开时，同时SlideMenu是打开的
        } else if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP && SlideMenu.this.mIsClosed == false)
        {
          // 关闭SlideMenu，拦截KeyEvent。
          SlideMenu.this.toggle();
          return true;

        } else
        {
          return false;
        }

      }
    });

  }

  /**
   * 将菜单项添加到Activity底部的ListView上
   * 
   * @param pArrayId
   *          菜单的资源字符串数组ID
   */
  public void addSlideMenuItem(int pArrayId)
  {
    // 根据传进来的资源数组ID找到字符串数组
    String[] _SlideMenuStringArray = mActivity.getResources().getStringArray(pArrayId);

    // 根据字符串数组生成SlideMenuItem对象，并添加到List中
    for (int i = 0; i < _SlideMenuStringArray.length; i++)
    {
      SlideMenuItem _SlideMenuItem = new SlideMenuItem(i, _SlideMenuStringArray[i]);
      mListMenuItems.add(_SlideMenuItem);

    }

    // 将菜单显示在当前Activity底部的ListView上
    AdapterSlideMenu _AdapterSlideMenu = new AdapterSlideMenu(mActivity, mListMenuItems);
    mListViewSlideMenu.setAdapter(_AdapterSlideMenu);

  }

  /**
   * 设置点击SlideMenuItem的监听器
   * 
   */
  public void setOnSlideMenuItemClickListener(OnSlideMenuItemClickListener pListener)
  {
    mOnSlideMenuItemClickListener = pListener;

    mListViewSlideMenu.setOnItemClickListener(new OnItemClickListener()
    {
      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id)
      {
        mOnSlideMenuItemClickListener.onSlideMenuItemClick(SlideMenu.this, mListMenuItems.get(position), parent, view, position, id);
      }
    });
  }

  /**
   * 打开/关闭菜单
   */
  public void toggle()
  {
    if (mIsClosed)
    {
      // 设置mBottomLlSlidemenu的Visibility为显示，实现打开效果
      mLinearLayoutSlideMenu.setVisibility(View.VISIBLE);
      LinearLayout.LayoutParams _LayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
      mFrame_Include_Bottom.setLayoutParams(_LayoutParams);

      // 设置箭头图片
      mImageViewArrow.setImageResource(R.drawable.common_title_btn_arrow_down_normal);

      mIsClosed = false;

    } else
    {
      // 设置mBottomLlSlidemenu的Visibility为隐藏，实现关闭效果
      mLinearLayoutSlideMenu.setVisibility(View.GONE);
      LinearLayout.LayoutParams _LayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
      mFrame_Include_Bottom.setLayoutParams(_LayoutParams);

      // 设置箭头图片
      mImageViewArrow.setImageResource(R.drawable.common_title_btn_arrow_up_normal);

      mIsClosed = true;

    }
  }
  
  
  
  
  
  public interface OnSlideMenuItemClickListener {
      /**
       * 用户点击SlideMenuItem时，系统调用本方法。
       * 
       * @param pSlideMenu SlideMenu对象
       * @param pSlideMenuItem SlideMenuItem对象
       * @param pParent 显示SlideMenu菜单的ListView对象
       * @param pView 被点击的View对象，由Adapter的getView()方法返回。
       * @param pPosition View对象在Adapter中的位置
       * @param pId 被点击的行号
       */
      void onSlideMenuItemClick(SlideMenu pSlideMenu, SlideMenuItem pSlideMenuItem, AdapterView<?> pParent, View pView, int pPosition, long pId);
  }

}
